<?php
declare (strict_types = 1);

namespace app\serve\controller;

use Firebase\JWT\JWT;

class Token
{
    protected $salt;

    public function __construct()
    {
        //从配置信息这种或取唯一字符串，你可以随便写比如md5('token')
        $this->salt = config('jwt.salt');
    }

    /**
     * 生成token
     * @param $user_id
     * @return mixed
     */
    function generateToken($user_id)
    {
        //获取当前时间戳
        $currentTime = time();
        $data = array(
            "iss" => '1902A',        //签发者 可以为空
            "aud" => '',             //面象的用户，可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + 7200, //token 过期时间 两小时
            "data" => [              //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
                'user_id' => $user_id,
            ]
        );
        //生成token
        $token = JWT::encode($data, $this->salt, "HS256");  //根据参数生成了 token
        return $token;
    }

    /**
     * 校验token时效性
     */
    public function chekToken($token)
    {
        $status=array("code"=>2);
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, $this->salt, array('HS256')); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code']=1;
            $res['data']=$arr['data'];
            return $res;

        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg']="签名不正确";
            return $status;
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg']="token失效";
            return $status;
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg']="token失效";
            return $status;
        }catch(\Exception $e) { //其他错误
            $status['msg']="未知错误";
            return $status;
        }
    }
}
